home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / csim / source.lha / source / C++SIM / ProcessList.cc < prev    next >
C/C++ Source or Header  |  1993-06-14  |  2KB  |  107 lines

  1. /*
  2.  * Copyright (C) 1993
  3.  *
  4.  * Department of Computing Science,
  5.  * The University,
  6.  * Newcastle upon Tyne,
  7.  * UK.
  8.  */
  9.  
  10. #ifndef PROCESSLIST_H_
  11. #include "ProcessList.h"
  12. #endif
  13.  
  14.  
  15. ProcessList::ProcessList () { Head = 0; }
  16.  
  17. void ProcessList::Insert (Process &p, boolean prior)
  18. {
  19.     // If list is empty, insert at head
  20.     if (!Head)
  21.     {
  22.     Head = new ProcessCons(p, Head);
  23.     return;
  24.     }
  25.  
  26.     // Try to insert before (if there is anything scheduled later)
  27.     ProcessIterator iter(*this);
  28.  
  29.     for (Process *prev = 0, *q = iter(); q; prev = q, q = iter())
  30.     {
  31.     if (prior)
  32.     {
  33.         if (q->evtime() >= p.evtime())
  34.         {
  35.         (void) InsertBefore(p, *q);
  36.         return;
  37.         }
  38.     }
  39.     else
  40.         if (q->evtime() > p.evtime())
  41.         {
  42.         (void) InsertBefore(p, *q);
  43.         return;
  44.         }
  45.     }
  46.  
  47.     // Got to insert at the end (currently pointed at by 'prev'
  48.     (void) InsertAfter(p, *prev);
  49. }
  50.  
  51. boolean ProcessList::InsertBefore (Process &ToInsert, Process &Before)
  52. {
  53.     for (ProcessCons *prev=0, *p=Head; p; prev=p, p=p->cdr())
  54.     if (p->car() == &Before) {
  55.         ProcessCons *newcons = new ProcessCons(ToInsert, p);
  56.         if (prev)
  57.         prev->SetfCdr(newcons);
  58.         else 
  59.         Head = newcons;
  60.  
  61.         return true;
  62.     }
  63.     return false;
  64. }
  65.  
  66. boolean ProcessList::InsertAfter (Process &ToInsert, Process &After)
  67. {
  68.     for (ProcessCons *p = Head; p; p = p->cdr())
  69.     if (p->car() == &After) {
  70.         ProcessCons *newcons = new ProcessCons(ToInsert, p->cdr());
  71.         p->SetfCdr(newcons);
  72.         return true;
  73.     }
  74.     return false;
  75. }
  76.  
  77. Process *ProcessList::Remove (const Process *element)
  78. {
  79.     Process *p = 0;
  80.  
  81.     // Take care of boundary condition - empty list
  82.     if (!Head) return 0;
  83.  
  84.     // Change unspecified element to "remove head of list" request
  85.     if (element == 0)
  86.     return(Remove(Head->car()));
  87.  
  88.     for (ProcessCons *prev = 0, *ptr = Head; ptr; prev = ptr, ptr = ptr->cdr())
  89.     {
  90.     if (ptr->car() == element)
  91.     {
  92.         ProcessCons *oldcons = ptr;
  93.         // unlink the cons cell for the element we're removing
  94.         if (prev)
  95.         prev->SetfCdr(ptr->cdr());
  96.         else
  97.         Head = ptr->cdr();
  98.         // return the pointer to the process
  99.         p = ptr->car();
  100.         // flush the dead cons cell
  101.         delete oldcons;
  102.     }
  103.     }
  104.  
  105.     return p;
  106. }
  107.